/*
 *  Openmysee
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include "stdafx.h"
#include "atlbase.h"
#include "Dmo.h"
#include "wmcodecconst.h"
#include "wmcodeciface.h"
#include "VideoEncParams.h"
#include "macros.h"

HRESULT CVideoEncParams::DefaultParams()
{
	dwTag = WMCFOURCC_WMV3;

	fFrameRate = 29.97F;
	fIsVBR = FALSE;
	nBitrate = 0;
	nBufferDelay = 5000;
	nKeyDist = 8;
	nProfile = P_MAIN;
	nQuality = 75;
	nVBRQuality = 98;

    // Get the complexity levels for the codec.
    HRESULT hr = GetComplexitySettings(&ComplexityLive, 
                               &ComplexityOffline, 
                               &ComplexityMax);
	if(SUCCEEDED(hr))
	{
		nComplexity = ComplexityLive;
	}

	return hr;
}

// Get the encoder complexity values for the codec.
HRESULT CVideoEncParams::GetComplexitySettings(DWORD* pLive, DWORD* pOffline, DWORD* pMax)
{
    HRESULT hr = S_OK;
    
    CComPtr<IMediaObject>  pDMO;
    CComPtr<IWMCodecProps> pCodecProps;

    DWORD cbValue = sizeof(DWORD);
    WMT_PROP_DATATYPE dataType;
    

    // Create a video encoder DMO.
    hr = CoCreateInstance(CLSID_CWMVEncMediaObject2,
                          NULL, 
                          CLSCTX_INPROC_SERVER, 
                          IID_IMediaObject, 
                          (void**)&pDMO);
    ON_FAIL("Could not create the encoder DMO.", hr);

    // Get the codec properties interface.
    hr = pDMO->QueryInterface(IID_IWMCodecProps, (void**)&pCodecProps);
    ON_FAIL("Could not get the codec props interface.", hr);

    // Get the setting for live encoding.
    hr = pCodecProps->GetCodecProp(WMCFOURCC_WMV3, 
                                   g_wszWMVCComplexityExLive, 
                                   &dataType, 
                                   (BYTE*)pLive, 
                                   &cbValue);
    ON_FAIL("Could not get the live complexity setting.", hr);

    // Get the setting for offline encoding.
    hr = pCodecProps->GetCodecProp(WMCFOURCC_WMV3, 
                                   g_wszWMVCComplexityExOffline, 
                                   &dataType, 
                                   (BYTE*)pOffline, 
                                   &cbValue);
    ON_FAIL("Could not get the offline complexity setting.", hr);

    // Get the maximum complexity setting.
    hr = pCodecProps->GetCodecProp(WMCFOURCC_WMV3, 
                                   g_wszWMVCComplexityExMax, 
                                   &dataType, 
                                   (BYTE*)pMax, 
                                   &cbValue);
    ON_FAIL("Could not get the maximum complexity setting.", hr);

    return hr;

}
